package pe.edu.upc.dsd.whereeat.controller;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.net.URI;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.mule.transport.http.multipart.Part;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;

import pe.edu.upc.dsd.esb.whereeat.component.service.CategoriaServiceComponent;
import pe.edu.upc.dsd.esb.whereeat.component.service.PlatoServiceComponent;
import pe.edu.upc.dsd.esb.whereeat.component.service.RestaurantServiceComponent;
import pe.edu.upc.dsd.whereeat.domain.Calificacion;
import pe.edu.upc.dsd.whereeat.domain.Categoria;
import pe.edu.upc.dsd.whereeat.domain.Plato;
import pe.edu.upc.dsd.whereeat.domain.Restaurant;
import pe.edu.upc.dsd.whereeat.domain.Usuario;


@Controller
public class RestaurantController {

	private static final String BASE_URL = "http://localhost:8703/upcdsd-20121-whereeat-platform/services/rest/restaurantes/";
	private static final String BASE_URL_CALIFICACION = "http://localhost:8708/whereeat-platform/resources/calificacion/";

	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private RestaurantServiceComponent restaurantServiceComponent;
	@Autowired
	private CategoriaServiceComponent categoriaServiceComponent; 
	@Autowired
	private PlatoServiceComponent platoServiceComponent;	
	
	public List<Categoria> listarCategoria = new ArrayList<Categoria> ();
	
	public List<Restaurant> listarRestaurant = new ArrayList<Restaurant> ();
	
	public HttpSession sesssion = null;
		
	public RestaurantController() {
		// TODO Auto-generated constructor stub
	}

	@RequestMapping("/restaurant/guardar.htm")
	public ModelAndView initial(HttpServletRequest request,	
			HttpServletResponse response) throws Exception {
		String view = "/main/home";
		int rpta=0;
		
		Restaurant resta = new Restaurant();

		String inputNombre = request.getParameter("inputNombres")!=null ?request.getParameter("inputNombres") :"";
		int selectCategoria = request.getParameter("txtCategoria")!= null ? Integer.parseInt(request.getParameter("txtCategoria")):0;
		String inputDescripcion = request.getParameter("inputDireccion")!=null ? request.getParameter("inputDireccion") :"";
		String telefono = request.getParameter("inputTelefono")!=null ? request.getParameter("inputTelefono") :"";
		String usuario = request.getParameter("inputCorreo")!=null ? request.getParameter("inputCorreo") : "";		
		String pwd = request.getParameter("inputContrasena")!=null ? request.getParameter("inputContrasena") :"";
		
		Date d = new Date();

		Categoria objcategoria = new Categoria();
		objcategoria.setCodigo(selectCategoria);

		resta.setNombre(inputNombre);
		resta.setCategoria(objcategoria);
		resta.setDescripcion(inputDescripcion);
		resta.setDireccion(inputDescripcion);
		resta.setEstado("A");
		resta.setCorreo(usuario.toLowerCase());
		resta.setPwd(pwd);
		resta.setFecha(d);
		resta.setCalificacions(new ArrayList<Calificacion>());
		resta.setPlatos(new ArrayList<Plato>());
		// 1 : ok 0: existe correo		
		rpta = restaurantServiceComponent.guardarRestaurant(resta);
		
		if (rpta==1){
			request.setAttribute("mensaje", "Se registro el Restaurant Satisfactoriamente");
		}else{
			request.setAttribute("mensaje", "El correo registrado ya existe");
		}		
		
		request.setAttribute("mensajeFlag", true);
		
		return new ModelAndView(view);

	}

	@RequestMapping("/restaurant/regEmpresa.htm")
	public ModelAndView login(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
				
		sesssion = request.getSession();
		
		listarCategoria = categoriaServiceComponent.listarCategorias();
		
		sesssion.setAttribute("listarCategoria", listarCategoria);

		return new ModelAndView("restaurant/loginRestaurant");
	}
	
	@RequestMapping("/restaurant/ediRestaurant.htm")
	public ModelAndView edit(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
		
		sesssion = request.getSession();
		
		listarRestaurant = (List<Restaurant>) sesssion.getAttribute("listarRestaurante");
		
		String codigoRestaurant = request.getParameter("codigo")!= null ? request.getParameter("codigo") :"";
		
		for (Restaurant r : listarRestaurant) {
			if (r.getCodigo() == Integer.parseInt(codigoRestaurant) ){
				request.setAttribute("restaurant", r);
			}
		}

		listarCategoria = new ArrayList<Categoria>();
		
		listarCategoria = categoriaServiceComponent.listarCategorias();
		
		sesssion.removeAttribute("listarCategoria");
		
		sesssion.setAttribute("listarCategoria", listarCategoria);
	
		return new ModelAndView("restaurant/ediRestaurant");
	}
	
	@RequestMapping("/restaurant/logueo.htm")
	public ModelAndView list(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
		
		String page = "/main/home";
		
		Restaurant restaurant = new Restaurant();
		
		sesssion = request.getSession();
		
		try {
			String username = request.getParameter("inputUsuario")!= null ? request.getParameter("inputUsuario") :"";
			
			String pwd = request.getParameter("inputPwd")!= null ? request.getParameter("inputPwd") :"";
					
			if (!"".equalsIgnoreCase(username) && !"".equalsIgnoreCase(pwd)  ){
			
				restaurant = restaurantServiceComponent.autenticarRestaurant(username.trim(), pwd.trim());
				
				if (restaurant!= null){
					
					listarRestaurant = new ArrayList<Restaurant>();
					
					listarRestaurant.add(restaurant);
					
					Usuario usuario = new Usuario();
					usuario.setCodigo(restaurant.getCodigo());
					usuario.setNombres(restaurant.getNombre());
					usuario.setCorreo(restaurant.getCorreo());
					usuario.setCodigoCategriaRestaurant(restaurant.getCategoria().getCodigo());
					usuario.setPwd(restaurant.getPwd());
					
					sesssion.removeAttribute("listarRestaurante");
					
					sesssion.setAttribute("login", "true");					
					sesssion.setAttribute("usuario", usuario);			
					sesssion.setAttribute("listarRestaurante", listarRestaurant);						
					
					page = "restaurant/listaRestaurante";
				}else{
					request.setAttribute("mensajeFlag", true);
					request.setAttribute("mensaje", "La Empresa aun no se encuentra registrado!!!!");
					page = "redirect:/restaurant/regEmpresa.htm";
				}	
				
			}else{
				
				request.setAttribute("mensajeFlag", true);
				request.setAttribute("mensaje", "Debe ingresar el usuario y pasword para ingresar al Sistema.");
			}			
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return new ModelAndView(page);
	}
	
	
	@RequestMapping("/restaurant/calificacionRestaurante.htm")
	public ModelAndView calificacion(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
		
		String resp = null;
		
		sesssion = request.getSession();
		
		String codigoRestaurant = request.getParameter("inputRestaurant")!= null ? request.getParameter("inputRestaurant") :"";
		
		String calificacion = request.getParameter("rtbCalif")!= null ? request.getParameter("rtbCalif") :"";
		
		Calificacion cal = new Calificacion();
		cal.setCodigoUsuario(1);
		cal.setCodigoRestaurant(Integer.parseInt(codigoRestaurant));
		cal.setCalificacion(Integer.parseInt(calificacion));
		
		URI url = new URI(BASE_URL_CALIFICACION);
		
		restTemplate.postForObject(url, cal, String.class);
		
		resp = restTemplate.getForObject(String.format(BASE_URL_CALIFICACION + "%s", 1),
				String.class);
	
		sesssion.setAttribute("califica", resp);
	
		return new ModelAndView("restaurant/consultaRestaurante");
	}
	
	@RequestMapping("/restaurant/detalleRestaurante.htm")
	public ModelAndView detalle(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
		
		String countCalificacion="0";
		
		List<Plato> listPlato =  new ArrayList<Plato>();
		
		List<Restaurant> listConsultaRestaurant =  new ArrayList<Restaurant>();
		
		sesssion = request.getSession();
		
		sesssion.removeAttribute("listPlato");
		
		Restaurant  restaurant = new Restaurant();
		
		Usuario usuario = new Usuario();
		
		usuario = (Usuario) sesssion.getAttribute("usuario");		
				
		listConsultaRestaurant = (List<Restaurant>) sesssion.getAttribute("listConsultaRestaurant");
		
		String codigoRestaurant = request.getParameter("codigo")!= null ? request.getParameter("codigo") :"";
		
		for (Restaurant r : listConsultaRestaurant) {
			if (r.getCodigo() == Integer.parseInt(codigoRestaurant) ){
				countCalificacion = restTemplate.getForObject(String.format(BASE_URL_CALIFICACION + "%s", usuario.getCodigo()),String.class);
				r.setCountCalificacion(Integer.parseInt(countCalificacion));
				restaurant = r;
			}
		}
		
		listPlato = platoServiceComponent.obtenerPlatosPorRestaurant(restaurant.getCodigo());
		
		sesssion.setAttribute("listPlato", listPlato);
		
		request.setAttribute("restaurant", restaurant);
	
		return new ModelAndView("restaurant/detalleRestaurante");
	}
	
	@RequestMapping("/restaurant/consultaRestaurant.htm")
	public ModelAndView consulta(HttpServletRequest request,
		
		HttpServletResponse response) throws Exception {
		
		String resp = null;
		
		sesssion = request.getSession();
		
		List<Restaurant> listConsultaRestaurant = new ArrayList<Restaurant>();
		
		List<Categoria> listCategoria = new ArrayList<Categoria>();
				
		String accion = request.getParameter("inputAccion")!= null ? request.getParameter("inputAccion") :"";
				
		if ("ir".equals(accion)){
			
			listCategoria = categoriaServiceComponent.listarCategorias();
			
			listConsultaRestaurant = restaurantServiceComponent.listarRestaurants();			
			
			for (int i = 0; i < listConsultaRestaurant.size(); i++) {
				resp = restTemplate.getForObject(String.format(BASE_URL_CALIFICACION + "%s", listConsultaRestaurant.get(i).getCodigo()),
						String.class);
				listConsultaRestaurant.get(i).setCountCalificacion(Integer.parseInt(resp));
			}
		}
		
		sesssion.setAttribute("listCategoria", listCategoria);
		
		sesssion.setAttribute("listConsultaRestaurant", listConsultaRestaurant);
	
		return new ModelAndView("restaurant/consultaRestaurante");
	}
	
	@RequestMapping("/restaurant/regresar.htm")
	public ModelAndView regresar(HttpServletRequest request,		
		HttpServletResponse response) throws Exception {
		/*
		sesssion = request.getSession();
		
		Usuario usuario = new Usuario();
		
		usuario = (Usuario) sesssion.getAttribute("usuario");
				
		listarRestaurant.add(restaurantServiceComponent.autenticarRestaurant(usuario.getCorreo(),usuario.getPwd()));
	*/
		return new ModelAndView("restaurant/listaRestaurante");
	}
	
	@RequestMapping("/restaurant/update.htm")
	public ModelAndView update(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
		
		Integer rpta = 0;
		
		String page = "restaurant/listaRestaurante";
		
		sesssion = request.getSession();
		
		Usuario usuario = new Usuario();
		
		Restaurant r = new Restaurant();
		
		Categoria c =new Categoria();
		
		usuario = (Usuario) sesssion.getAttribute("usuario");
				
		String categoria = request.getParameter("txtCategoria")!=null ? request.getParameter("txtCategoria") : "";
		String descripcion = request.getParameter("inputDescripcion")!=null ? request.getParameter("inputDescripcion") : "";
		String direccion = request.getParameter("inputUbicacion")!=null ? request.getParameter("inputUbicacion") : "";
				
		c.setCodigo(Integer.parseInt(categoria));
		
		r.setCodigo(usuario.getCodigo());
		r.setCorreo(usuario.getCorreo());
		r.setNombre(usuario.getNombres());
		r.setFecha(new Date());
		r.setCategoria(c);
		r.setDescripcion(descripcion);
		r.setDireccion(direccion);
		r.setEstado("A");
		r.setPwd(usuario.getPwd());
		
		rpta = restaurantServiceComponent.actualizarRestaurant(r);
		
		if (rpta==1){
			
			listarRestaurant = new ArrayList<Restaurant>();
			
			listarRestaurant.add(restaurantServiceComponent.autenticarRestaurant(usuario.getCorreo(), usuario.getPwd()));
			
			sesssion.removeAttribute("listarRestaurante");
			
			sesssion.setAttribute("listarRestaurante", listarRestaurant);
						
		}else{
			
			request.setAttribute("mensajeFlag", true);
			request.setAttribute("mensaje", "Error no se ha realizado las actualizaciones!!!!");
			
		}
		
		return new ModelAndView(page);
	}
	
}
